//
//  FunctionController.swift
//  one
//
//  Created by huangfeng on 2018/5/1.
//  Copyright © 2018年 huangfeng. All rights reserved.
//

import UIKit

class FunctionController: UIViewController {

    var  completionCallBack: (([String]) ->())?
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let onebtn = UIButton(frame: CGRect(x: 20, y: 20, width: 100, height: 30))
        onebtn.addTarget(self, action: #selector(clickMe(btn:)), for: .touchUpInside)
        onebtn.setTitle("返回", for: .normal)
        onebtn.setTitleColor(#colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1), for: .normal)
        onebtn.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
        onebtn.layer.cornerRadius = 5
        onebtn.layer.shadowOffset = CGSize(width: 100, height: 20)
        onebtn.layer.shadowColor = UIColor.black.cgColor
        view.addSubview(onebtn)

        
        
        // 函数定义的三种形式   在swift 中 _ 是可以忽略不感兴趣的 的内容
        sum(num1: 10, num2: 30)
        sum1(10, 30)
        sum2(x: 10, y: 30)
        
        print(sum3())
        print(sum3(x: 10, y: 20))
        print(sum3(x: 10))
        print(sum3(y: 20))
        
        //block swift 中 函数是特殊的闭包  提前定义 需要时调用 可以当做函数传递
        print(demo(x: 10, y: 20))
        let de = demo
        print(de(10, 20))
        
        
        // >1 最简单的闭包
        let b1 = {
            print("Hello world")
        }
        b1()
        
        
        /// 带参数的闭包  参数 返回值都在{} 中定义  'in' 前是参数和返回值 后边是实现代码
        let b2 = { ( x: Int) -> () in
            print(x)
        }
        
        b2(5)
        
        
        
        
        //闭包中的 weak self 使用
        // 方法1
        weak var weakself = self
        gcddmoe {(result) in

            //闭包的想互调用
            print("获取的新闻数据 \(result) \(String(describing: weakself?.view))")
        }
        
        // 方法2
        gcddmoe {[weak self] _ in
            
            //闭包的想互调用
            print(self?.view)
        }
        
    }
    
    
    /// 通过闭包 传递参数
    func gcddmoe(completion: @escaping ([String]) -> ()) -> () {
        
        //block 相互调用
        completionCallBack = completion
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            Thread.sleep(forTimeInterval: 1)
            
            let json = ["头条","你好","出大事了"]
            
            DispatchQueue.main.async(execute: {
                completion(json)
            })
        }
    }
    
    
    
    func demo(x: Int, y: Int) -> Int {
        return x + y
    }
    
    
    /// 内部参数 OC 痕迹 明显   num1 num2 外部调用 会显示的参数 不影响函数内部使用
    // swift 中有oc 没有的设置 默认值功能  可以在设置参数的时候 自由选择
    func sum3 ( x: Int = 1, y: Int = 2) -> Int {
        return x + y
    }
    
    /// 内部参数 OC 痕迹 明显   num1 num2 外部调用 会显示的参数 不影响函数内部使用
    func sum2 ( x: Int, y: Int) -> Int {
        return x + y
    }
    
    
    
    /// 函数的外部参数    OC 痕迹 明显   num1 num2 外部调用 会显示的参数 不影响函数内部使用
    func sum (num1 x: Int, num2 y: Int) -> Int {
        return x + y
    }
    
    /// 函数的外部参数    OC 痕迹 明显   num1 num2 外部调用 会显示的参数 不影响函数内部使用
    /// 外部参数 如果定义为 _ 外部调用时会忽略 形参的名字
    func sum1 (_ x: Int, _ y: Int) -> Int {
        return x + y
    }
    
    @objc func clickMe(btn: UIButton) ->() {
        self.dismiss(animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    //OC 中的 delloc
    deinit {
        print("我放假了")
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
